//package com.ftg.learn.chapter04.aop;
//
//
//import org.aspectj.lang.JoinPoint;
//import org.aspectj.lang.ProceedingJoinPoint;
//import org.aspectj.lang.annotation.*;
//import org.springframework.context.annotation.EnableAspectJAutoProxy;
//import org.springframework.stereotype.Component;
//
//import java.util.Arrays;
//
///**
// * 这就是我们的切面类
// * @Aspect 声明当前使用Aspect技术，就是切面类
// * @Component  我们为了调用spring容器里面其它组件,要把这个类也注入到容器当中成为组件
// * @EnableAspectJAutoProxy  是否开始Aspect自动生成代理,在@Configuration只需要声明一次。
// * @author kangjx
// * @date 2022/11/7
// */
//@Aspect
//@Component
//@EnableAspectJAutoProxy
//public class StudentDaoAop {
//
////    @Before("com.ftg.learn.chapter04.dao.StudentDao.createStudent()")
//    //通知 : execution 表达式 返回值 com.ftg.learn.chapter04.dao.StudentDao.createStudent(..))
//
//    // AfterReturning  After 出了bug  ！ 你不是告诉我们在原方法执行完成以后，才执行吗
//    //只关注目标类
//
//    @Before("execution(* com.ftg.learn.chapter04.dao.*.create*(..))")
//    public void sayOther(JoinPoint pjp) {
//        //日志  事务   性能监测  权限 RBAC
//        System.out.println(pjp.getTarget().getClass().getSimpleName());
//        System.out.println("你看我是不是在studentDao creatStudent方法 之前执行");
//    }
//
//    @After("execution(* com.ftg.learn.chapter04.dao.StudentDao.createStudent(..))")
//    public void sayOther1() {
//        System.out.println("你看我是不是在studentDao creatStudent方法 之后后后执行");
//    }
//
//    //return 完成方法 不一 定完成了
//    @AfterReturning("execution(* com.ftg.learn.chapter04.dao.StudentDao.createStudent(..))")
//    public void sayOther2() {
//        System.out.println("你看我是不是在studentDao creatStudent方法 AfterReturning");
//    }
//
//    /**
//     * 只有方法抛出异常
//     */
//    @AfterThrowing("execution(* com.ftg.learn.chapter04.dao.StudentDao.createStudent(..))")
//    public void sayOther3() {
//        System.out.println("你看我是不是在studentDao creatStudent方法 AfterThrowing");
//    }
//
//    /**
//     * execution(访问修饰符 返回值类型 方法地址(列表))
//     * execution(* * 名称.*.*(..))
//     * 围绕方式
//     * @param proceedingJoinPoint 连接点，表示目标里面的的正在运行的方法
//     */
//    @Around("execution(public int com.ftg.learn.chapter04.dao.StudentDao.createStudent(..))")
//    public Object sayOther4(ProceedingJoinPoint proceedingJoinPoint) {
//        System.out.println("你看我是不是在studentDao creatStudent方法 Around前");
//        Object obj = null;
//        try {
////            是否执行目标类里面的方法
//            System.out.println(proceedingJoinPoint.getTarget().getClass().getName());
//
//            //这就目标类
//            Object target =  proceedingJoinPoint.getTarget();
//            //当前方法的参数列表
//            Object[] os = proceedingJoinPoint.getArgs();
//            System.out.println(Arrays.toString(os));
//
//            os[0] = os[0].toString().concat("你叫:");
//            os[1] = Integer.valueOf(os[1].toString()) + 23;
//            long l1 = System.currentTimeMillis();
//            obj= proceedingJoinPoint.proceed(os);
//            long l2 = System.currentTimeMillis();
//            //jdbc mybatis 写库里
//            System.out.println(l2 - l1);
//
//        } catch (Throwable throwable) {
//            throwable.printStackTrace();
//        }
//        System.out.println("你看我是不是在studentDao creatStudent方法 Around后");
//        return obj;
//    }
////    Around
////        Before  多个的时候，我们按照方法 名称 Ascii码顺序
////        AfterReturning 没有异常 | AfterThrowing 出异常
////        After
////    Around
//
//}
